﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Xml.Linq;
using System.IO;

using System.ServiceModel;
using Teenusekiht;
using AjaxControlToolkit.HTMLEditor;

public partial class Kohvik_Menu : System.Web.UI.Page
{
    IService1 sc;
    int kohvikID = 0, deleteMenuID=0, toggleMenuToday=0, role = 0;

    //LISATUD: SEE OSA SAI LISATUD HTML EDITOR'I LISAMISEKS! LK
    HiddenField hfi ;
    Editor rte ;
    Button btn ;

    protected void Page_Load(object sender, EventArgs e)
    {
        sc = new ChannelFactory<IService1>("Serv").CreateChannel();
        
        if (Request.QueryString["kohvik"] == null) Response.Redirect("~/Default.aspx");
        else if ( int.TryParse(Request.QueryString["kohvik"], out kohvikID) ) { }
        else Response.Redirect("~/Default.aspx");

        if (Session["sess"] == null) Session["sess"] = SessionStatic.CreateSession();
        SessionData sesDat = SessionStatic.GetData((int)Session["sess"]);
        role = sesDat.AskRole(kohvikID);
        //System.Web.HttpContext.Current.Response.Write(("<SCRIPT LANGUAGE=\"JavaScript\">alert(\"" + role + "\")</SCRIPT>"));
        if (role == ROLE.OMANIK)
        {
            if (Request.QueryString["delete"] == null) deleteMenuID = 0;
            else if (int.TryParse(Request.QueryString["delete"], out deleteMenuID))
                sc.KustutaMenuuJaKohvikuSeos(kohvikID, deleteMenuID, Rakendus.RAKENDUSE_KOOD);
            else { };
            if (Request.QueryString["toggleMenu"] == null) toggleMenuToday = 0;
            else if (int.TryParse(Request.QueryString["toggleMenu"], out toggleMenuToday))
                sc.MuudaKohvikuMenyyTodayOlek(kohvikID, toggleMenuToday, Rakendus.RAKENDUSE_KOOD);
            else { };
        }

        KohvikType kohvik = sc.AnnaKohvik(kohvikID, Rakendus.RAKENDUSE_KOOD);
        if (kohvik == null) Response.Redirect("~/Default.aspx");

        //LISATUD: SEE OSA SAI LISATUD HTML EDITOR'I LISAMISEKS! LK
        if ( role == ROLE . OMANIK ) {
            hfi = new HiddenField () ;
            divKirjeldus . Controls . Add ( hfi ) ;
            if ( ! IsPostBack ) hfi . Value = kohvik . Kohviku_ID . ToString () ;
            rte = new Editor () ;
            rte . Width = Unit . Parse ( "100%" ) ;
            rte . Height = Unit . Parse ( "50ex" ) ;
            divKirjeldus . Controls . Add ( rte ) ;
            if ( ! IsPostBack ) rte . Content = kohvik . Kirjeldus ;
            btn = new Button () ;
            btn . Text = "Salvesta" ;
            divKirjeldus . Controls . Add ( btn ) ;
            btn . Click += new EventHandler ( Button_Click ) ; }
          else {
            Literal lit = new Literal () ;
            lit . Text = kohvik . Kirjeldus ;
            divKirjeldus . Controls . Add ( lit ) ; }

        if (kohvik.Pilt != "" && kohvik.Pilt != null) 
            imgKohvikuPilt.ImageUrl = "~/Kohvik/Pildid/" + kohvikID + "/" + kohvik.Pilt;
        else imgKohvikuPilt.Visible = false;

        string nimi = lbKohvikuNimi.Text = sc.KohvikuNimiIdJargi(kohvikID, Rakendus.RAKENDUSE_KOOD);
        Page.Title += nimi;
        if (nimi == "") linkKohvikuKomm.Visible = lbl_Lahtiolek.Visible = false;
        linkKohvikuKomm.NavigateUrl = "~/Kohvik/KohvikuKomm.aspx?id=" + kohvikID;
        //linkSoodustused.NavigateUrl = "~/Kohvik/Soodustus.aspx?kohvik=" + kohvikID;
        //linkSoodustused.Visible = 
        ph_lisaMenu.Visible = (role == ROLE.OMANIK);

        string[] avatud = sc.KohvikuLahtiolekuAeg(kohvikID, "Esmaspäev", Rakendus.RAKENDUSE_KOOD);
        if (avatud != null)
        {
            lbl_Lahtiolek.Text = "Avatud E-R " + avatud[0] + " - " + avatud[1];
        }

        showMenus(true, lblMenuToday, ph_MenusToday);
        showMenus(false, lblMenuNotToday, ph_MenusNotToday);

        int[] menyyd = sc.AnnaMenyydMidaPoleKohvikul(kohvikID, Rakendus.RAKENDUSE_KOOD);
        for (int i = 0; i < menyyd.Length; i++)
            ddl_Menyy.Items.Add(new ListItem(sc.MenuuNimetus(menyyd[i], Rakendus.RAKENDUSE_KOOD), "" + menyyd[i]));

        ph_Facebook.Controls.Add(new LiteralControl("<iframe src=\"http://www.facebook.com/plugins/like.php?href=http://localhost:53017/KohvikuProjekt/Kohvik/Menu.aspx?kohvik="+ kohvikID + "&amp;layout=standard&amp;show_faces=false&amp;width=450&amp;action=like&amp;colorscheme=light&amp;height=35\" scrolling=\"no\" frameborder=\"0\" style=\"border:none; overflow:hidden; width:450px; height:35px;\" allowTransparency=\"true\" name=\"facebook\"></iframe>"));
        
        //saveToXML();
        //readFromXML();
    }

    protected void showMenus(bool isToday, Label menyTypeLabel, PlaceHolder ph_menus) 
    {
        int[] menuIDs = sc.MenuuKohvikuIdJargi(kohvikID, isToday, Rakendus.RAKENDUSE_KOOD);
        if (menuIDs.Length != 0)
        {
            menyTypeLabel.Text = isToday ? "Tänased menüüd" : "Teised menüüd";

            for (int i = 0; i < menuIDs.Length; i++)
            {
                string menuName = sc.MenuuNimetus(menuIDs[i], Rakendus.RAKENDUSE_KOOD);
                MenyyItem[] menuItems = sc.TagastaMenuuArtiklid(menuIDs[i], Rakendus.RAKENDUSE_KOOD);
                
                if (role != ROLE.OMANIK && menuItems.Length != 0)
                {
                    printMenuNameAndLink(menuName, menuIDs[i], isToday, ph_menus);
                    printMenu(menuIDs[i], ph_menus, menuItems);
                }
                else if (role == ROLE.OMANIK)
                {
                    printMenuNameAndLink(menuName, menuIDs[i], isToday, ph_menus);
                    printMenu(menuIDs[i], ph_menus, menuItems);
                }

                ph_menus.Controls.Add(new LiteralControl("<br />"));
            }
        }
    }

    protected void printMenuNameAndLink(string menuName, int menuID, bool isToday, PlaceHolder ph)
    {
        ph.Controls.Add(new LiteralControl("<p><b><i>" + menuName + "</i></b> &nbsp;&nbsp; "));
        if (role == ROLE.OMANIK)
        {
            ph.Controls.Add(new HyperLink()
            {
                Text = "[ Muuda ]",
                NavigateUrl = "~/Kohvik/EditMenu.aspx?menu=" + menuID
            });
            ph.Controls.Add(new LiteralControl(" &nbsp;&nbsp; "));
            ph.Controls.Add(new HyperLink()
            {
                Text = "[ Kustuta ]",
                NavigateUrl = "~/Kohvik/Menu.aspx?kohvik=" + kohvikID + "&delete=" + menuID
            });
            ph.Controls.Add(new LiteralControl(" &nbsp;&nbsp; "));
            ph.Controls.Add(new HyperLink()
            {
                Text = isToday ? "[ Muuda mitte tänaseks ]" : "[ Muuda tänaseks ]",
                NavigateUrl = "~/Kohvik/Menu.aspx?kohvik=" + kohvikID + "&toggleMenu=" + menuID
            });
        }
        ph.Controls.Add(new LiteralControl("</p>"));
    }

    protected void printMenu(int menuID, PlaceHolder ph, MenyyItem[] menuItems)
    {
        int i = 0;

        Table menuTable = new Table() { GridLines = GridLines.Horizontal, Width = Unit.Percentage(55) };
        TableRow r = new TableRow() { CssClass = "headerrow" };
        TableCell c = new TableCell();
        c.Controls.Add(new LiteralControl("<b>Nimetus</b>"));
        r.Cells.Add(c);
        c = new TableCell();
        c.Controls.Add(new LiteralControl("<b>Hind</b>"));
        r.Cells.Add(c);
        c = new TableCell();
        c.Controls.Add(new LiteralControl("<b>Soodustus</b>"));
        r.Cells.Add(c);
        c = new TableCell();
        c.Controls.Add(new LiteralControl("<b>Kommentaar</b>"));
        r.Cells.Add(c);
        menuTable.Rows.Add(r);

        int[] myygiArtikliteIDd = menuItems.Select(m => m.Id).ToArray();
        SoodustusType[] soodustused = sc.AnnaSoodustused(myygiArtikliteIDd, Rakendus.RAKENDUSE_KOOD); // SOODUSTUSED

        foreach (MenyyItem item in menuItems)
        {
            r = new TableRow() { CssClass = (i % 2 == 0) ? "oddrow" : "evenrow" };
            c = new TableCell();
            c.Controls.Add(new LiteralControl(item.MyygiartikliNimi));
            r.Cells.Add(c);
            c = new TableCell(); // { HorizontalAlign = HorizontalAlign.Right };
            c.Controls.Add(new LiteralControl((double)item.Hind / 100 + " €"));
            r.Cells.Add(c);
            c = new TableCell();
            if (soodustused.Length > 0)
            {
                string soodusProtsent = (soodustused[i].Kordaja != null) ?
                    String.Format("{0:0.00}", soodustused[i].Kordaja * (double)item.Hind / 100) + " €" : soodustused[i].Hind + " €";
                c.Controls.Add(new LiteralControl(soodustused[i].SoodustuseNimi + ": " + soodusProtsent));
            }
            else c.Controls.Add(new LiteralControl(""));
            r.Cells.Add(c);
            c = new TableCell();
            c.Controls.Add(new LiteralControl(item.Kommentaar));
            r.Cells.Add(c);
            menuTable.Rows.Add(r);
            i++;
        }
        ph.Controls.Add(menuTable);
    }

    protected void btn_LisaMenu_Click(object sender, EventArgs e)
    {
        string nimi = tb_LisaMenu.Text;
        int? id = sc.LisaUusMenuu(kohvikID, nimi, Rakendus.RAKENDUSE_KOOD);
        if (id != null) lblCheck.Text = "Menüü lisatud.";
    }

    protected void btnLisaExist_Click(object sender, EventArgs e)
    {
        int menyyID = int.Parse(ddl_Menyy.SelectedValue);
        int? id = sc.LisaKohvikuleMenuu(kohvikID, menyyID, Rakendus.RAKENDUSE_KOOD);
        if (id != null) Response.Redirect("~/Kohvik/Menu.aspx?kohvik=" + kohvikID);
    }

    protected void saveToXML()
    {
        XDocument xmlDokumentMenus = new XDocument();
        XDocument xmlDokumentMenuItems = new XDocument();
        XDocument xmlDokumentKaubad = new XDocument();
        XDocument xmlDokumentSoodustused = new XDocument();

        xmlDokumentMenus.Add(new XElement("Menus"));
        xmlDokumentMenuItems.Add(new XElement("MenuItems"));
        xmlDokumentKaubad.Add(new XElement("Kaubad"));
        xmlDokumentSoodustused.Add(new XElement("Soodustused"));

        int[] menuIDs = sc.MenuuKohvikuIdJargi(kohvikID, true, Rakendus.RAKENDUSE_KOOD);
        if (menuIDs.Length != 0)
        {
            for (int i = 0; i < menuIDs.Length; i++)
            {
                string menuName = sc.MenuuNimetus(menuIDs[i], Rakendus.RAKENDUSE_KOOD);
                XElement menu = new XElement("Menu");
                menu.Add(new XElement("Nimetus") { Value = menuName });
                XElement menuItemsXML = new XElement("MenuItems");
                MenyyItem[] menuItems = sc.TagastaMenuuArtiklid(menuIDs[i], Rakendus.RAKENDUSE_KOOD);
                foreach (MenyyItem item in menuItems)
                {
                    XElement menuItem = new XElement("MenuItemID") { Value = "" + item.Id };
                    menuItemsXML.Add(menuItem);

                    if (! xmlDokumentMenuItems.Elements().First().Elements().Any(e => e.Element("ID").Value == "" + item.Id))
                    {
                        menuItem = new XElement("MenuItem");
                        XElement itemID = new XElement("ID") { Value = "" + item.Id };
                        XElement kaupID = new XElement("KaupID") { Value = "" + item.Kaup_ID };
                        XElement myygiArtikkel = new XElement("MyygiartikliNimi") { Value = item.MyygiartikliNimi };
                        XElement hind = new XElement("Hind") { Value = "" + item.Hind };
                        XElement komm = new XElement("Kommentaar") { Value = item.Kommentaar };
                        menuItem.Add(itemID);
                        menuItem.Add(kaupID);
                        menuItem.Add(myygiArtikkel);
                        menuItem.Add(hind);
                        menuItem.Add(komm);
                        xmlDokumentMenuItems.Elements().First().Add(menuItem);
                    }
                }
                menu.Add(menuItemsXML);
                xmlDokumentMenus.Elements().First().Add(menu);
            }
        }

        string path = Server.MapPath("~/Kohvik/Menu.xml"), menuItemsPath = Server.MapPath("~/Kohvik/MenuItems.xml");
        StreamWriter menuWriter = new StreamWriter(path), menuItemsWriter = new StreamWriter(menuItemsPath);

        xmlDokumentMenus.Save(menuWriter);
        xmlDokumentMenuItems.Save(menuItemsWriter);
        menuWriter.Close();
        menuItemsWriter.Close();
    }

    protected void readFromXML()
    {
        string path = Server.MapPath("~/Kohvik/Menu.xml"), menuItemsPath = Server.MapPath("~/Kohvik/MenuItems.xml");
        XElement menusFromFile = XElement.Load(path);
        List<MenuForXML> menus = new List<MenuForXML>();

        foreach (XElement menuXML in menusFromFile.Elements())
        {
            MenuForXML menuForXML = new MenuForXML();

            menuForXML.Nimi = menuXML.Element("Nimetus").Value;
            menuForXML.MyygiArtiklid = new List<MenyyItem>();

            var menuItems = menuXML.Element("MenuItems").Elements();

            foreach (XElement menuItemXML in menuItems)
            {
                MenyyItem menuItem = new MenyyItem();
                menuItem.Id = int.Parse(menuItemXML.Element("MenuItemID").Value);
                menuForXML.MyygiArtiklid.Add(menuItem);
            }

            menus.Add(menuForXML);
        }

        System.Diagnostics.Debug.Print(menus.ToString());

        //System.Diagnostics.Debug.Print(menuXML.ToString());

        
    }

    //LISATUD: SEE OSA SAI LISATUD HTML EDITOR'I LISAMISEKS! LK
    protected void Button_Click ( object sender , EventArgs e )
    {
        if ( role == ROLE . OMANIK ) {
            int parsed ;
            int kohvikId = ( int . TryParse ( hfi . Value , out parsed ) ) ? parsed : -1 ;
            if ( kohvikId >= 0 )
                sc . MuudaKohvikuKirjeldus ( kohvikId , rte . Content , Rakendus . RAKENDUSE_KOOD ) ; }
                //TODO: SELLE TULEMUS POLE KONTROLLITUD!
    }

}